﻿using DesignModeDemo.单例模式.懒汉式;
using DesignModeDemo.单例模式.饿汉模式;

Console.WriteLine("单例模式.饿汉模式测试!");
//第一种测试： 构造函数私有的，new的时候报错
//SingleHungry  _singleHungry=new SingleHungry();
// 第二种测试： 比对创建多个对象，然后多个对象的Hashvalue
var single1 = SingleHungry.GetSingleHungry();
var single2 = SingleHungry.GetSingleHungry();
var single3 = SingleHungry.GetSingleHungry();
Console.WriteLine(single1.GetHashCode());
Console.WriteLine(single2.GetHashCode());
Console.WriteLine(single3.GetHashCode());
//结论：饿汉式的单例模式不推荐使用，因为还没调用，对象就已经创建，造成资源的浪费;



Console.WriteLine("单例模式.懒汉式测试!");
var singleLayMan1 = SingleLayMan.GetSingleLayMan2();
var singleLayMan2 = SingleLayMan.GetSingleLayMan2();
Console.WriteLine(singleLayMan1.GetHashCode());
Console.WriteLine(singleLayMan2.GetHashCode());
//懒汉式单例模式只有在调用方法时才会去创建，不会造成资源的浪费,但会有线程安全问题



Console.WriteLine("单例模式.懒汉式多线程环境测试!");

for (int i = 0; i < 10; i++)
{
    new Thread(() => {
        Console.WriteLine($"第{i}次执行");
        SingleLayMan.GetSingleLayMan2();
    }).Start();
    //Task.Run(() => SingleLayMan.GetSingleLayMan2()) ;

}

var type = Type.GetType("DesignModeDemo.单例模式.懒汉式.SingleLayMan");
//获取私有的构造函数
var ctors = type?.GetConstructors(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
//执行构造函数
SingleLayMan singleLayMan = (SingleLayMan)ctors[0].Invoke(null);
Console.WriteLine(singleLayMan1.GetHashCode());
Console.WriteLine(singleLayMan.GetHashCode());

//通过两次反射依然可以创建对象，具体过程是new没有执行，跨国了new 直接去执行构造函数创建对象了

//解决办法 搞个标记 只有第一次会创建对象，后面都不会创建
Console.ReadLine();
